
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Gray
#property indicator_color2 Gray
#property indicator_color3 Gray

extern int degree = 3;
extern double kstd = 1.5;
extern int bars = 240;
extern int shift = 0;
double g_ibuf_96[];
double g_ibuf_100[];
double g_ibuf_104[];
double gda_108[10][10];
double gda_112[10];
double gda_116[10];
double gda_120[20];
double gd_124;
int gi_132;
int gi_136;
int gi_140;
double gd_148;
double gd_156;
double gd_164;
int gi_172;
int gi_176;
int gi_180;
int gi_184;
int gi_188;
double gd_192;
int gi_200 = 0;

int init() {
   SetIndexBuffer(0, g_ibuf_96);
   SetIndexBuffer(1, g_ibuf_100);
   SetIndexBuffer(2, g_ibuf_104);
   SetIndexStyle(0, DRAW_LINE, STYLE_DOT);
   SetIndexStyle(1, DRAW_LINE, STYLE_DOT);
   SetIndexStyle(2, DRAW_LINE, STYLE_DOT);
   SetIndexEmptyValue(0, 0.0);
   SetIndexEmptyValue(1, 0.0);
   SetIndexEmptyValue(2, 0.0);
   SetIndexShift(0, shift);
   SetIndexShift(1, shift);
   SetIndexShift(2, shift);
   return (0);
}

int deinit() {
   return (0);
}

int start() {
   if (Bars >= bars) {
      gi_132 = bars;
      gi_136 = gi_132;
      gda_120[1] = gi_136 + 1;
      gi_188 = degree + 1;
      SetIndexDrawBegin(0, Bars - gi_136 - 1);
      SetIndexDrawBegin(1, Bars - gi_136 - 1);
      SetIndexDrawBegin(2, Bars - gi_136 - 1);
      for (int li_0 = 1; li_0 <= gi_188 * 2 - 2; li_0++) {
         gd_124 = 0;
         for (gi_140 = gi_200; gi_140 <= gi_200 + gi_136; gi_140++) gd_124 += MathPow(gi_140, li_0);
         gda_120[li_0 + 1] = gd_124;
      }
      for (li_0 = 1; li_0 <= gi_188; li_0++) {
         gd_124 = 0.0;
         for (gi_140 = gi_200; gi_140 <= gi_200 + gi_136; gi_140++) {
            if (li_0 == 1) gd_124 += Close[gi_140];
            else gd_124 += Close[gi_140] * MathPow(gi_140, li_0 - 1);
         }
         gda_112[li_0] = gd_124;
      }
      for (gi_176 = 1; gi_176 <= gi_188; gi_176++) {
         for (gi_172 = 1; gi_172 <= gi_188; gi_172++) {
            gi_180 = gi_172 + gi_176 - 1;
            gda_108[gi_172][gi_176] = gda_120[gi_180];
         }
      }
      for (gi_180 = 1; gi_180 <= gi_188 - 1; gi_180++) {
         gi_184 = 0;
         gd_156 = 0;
         for (gi_172 = gi_180; gi_172 <= gi_188; gi_172++) {
            if (MathAbs(gda_108[gi_172][gi_180]) > gd_156) {
               gd_156 = MathAbs(gda_108[gi_172][gi_180]);
               gi_184 = gi_172;
            }
         }
         if (gi_184 == 0) return (0);
         if (gi_184 != gi_180) {
            for (gi_176 = 1; gi_176 <= gi_188; gi_176++) {
               gd_164 = gda_108[gi_180][gi_176];
               gda_108[gi_180][gi_176] = gda_108[gi_184][gi_176];
               gda_108[gi_184][gi_176] = gd_164;
            }
            gd_164 = gda_112[gi_180];
            gda_112[gi_180] = gda_112[gi_184];
            gda_112[gi_184] = gd_164;
         }
         for (gi_172 = gi_180 + 1; gi_172 <= gi_188; gi_172++) {
            gd_148 = gda_108[gi_172][gi_180] / gda_108[gi_180][gi_180];
            for (gi_176 = 1; gi_176 <= gi_188; gi_176++) {
               if (gi_176 == gi_180) gda_108[gi_172][gi_176] = 0;
               else gda_108[gi_172][gi_176] = gda_108[gi_172][gi_176] - gd_148 * gda_108[gi_180][gi_176];
            }
            gda_112[gi_172] = gda_112[gi_172] - gd_148 * gda_112[gi_180];
         }
      }
      gda_116[gi_188] = gda_112[gi_188] / gda_108[gi_188][gi_188];
      for (gi_172 = gi_188 - 1; gi_172 >= 1; gi_172--) {
         gd_164 = 0;
         for (gi_176 = 1; gi_176 <= gi_188 - gi_172; gi_176++) {
            gd_164 += (gda_108[gi_172][gi_172 + gi_176]) * (gda_116[gi_172 + gi_176]);
            gda_116[gi_172] = 1 / gda_108[gi_172][gi_172] * (gda_112[gi_172] - gd_164);
         }
      }
      for (gi_140 = gi_200; gi_140 <= gi_200 + gi_136; gi_140++) {
         gd_124 = 0;
         for (gi_180 = 1; gi_180 <= degree; gi_180++) gd_124 += (gda_116[gi_180 + 1]) * MathPow(gi_140, gi_180);
         g_ibuf_96[gi_140] = gda_116[1] + gd_124;
      }
      gd_192 = 0.0;
      for (gi_140 = gi_200; gi_140 <= gi_200 + gi_136; gi_140++) gd_192 += MathPow(Close[gi_140] - g_ibuf_96[gi_140], 2);
      gd_192 = MathSqrt(gd_192 / (gi_136 + 1)) * kstd;
      for (gi_140 = gi_200; gi_140 <= gi_200 + gi_136; gi_140++) {
         g_ibuf_100[gi_140] = g_ibuf_96[gi_140] + gd_192;
         g_ibuf_104[gi_140] = g_ibuf_96[gi_140] - gd_192;
      }
      return (0);
   }
}